通过观察 @Enable* 注解的源码,可以发现所有的注解都有一个 @Import 注解。
@Import 注解是用来导入配置类的,这也就是说这些自动开启的实现其实是导入了一些自动配置的 Bean。
@Import 注解导入配置方式的三种类型
1. 直接导入配置类
1 | ({ElementType.TYPE}) |
直接导入配置类 SchedulingConfiguration,这个类注解了 @Configuration,且注册了一个 scheduledAnnotationProcessor 的 Bean。
2. 依据条件选择配置类
1 | (ElementType.TYPE) |
AsyncConfigurationSelector 通过条件来选择需要导入的配置类,AsyncConfigurationSelector 的根接口为 ImportSelector,这个接口需要重写 selectImports 方法,在此方法内进行事先条件判断。若 adviceMode 为 PORXY,则返回 ProxyAsyncConfiguration 这个配置类;若 activeMode 为 ASPECTJ,则返回 AspectJAsyncConfiguration 配置类,源码如下:
1 | public class AsyncConfigurationSelector extends AdviceModeImportSelector<EnableAsync> { |
3. 动态注册 Bean
1 | (ElementType.TYPE) |
AspectJAutoProxyRegistrar 实现了 ImportBeanDefinitionRegistrar 接口,ImportBeanDefinitionRegistrar 的作用是在运行时自动添加 Bean 到已有的配置类,通过重写方法:
1 | public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) |
其中,AnnotationMetadata 参数用来获得当前配置类上的注解;BeanDefinittionRegistry 参数用来注册 Bean。源码如下:
1 | class AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar { |